package com.ysf.cn.mainshi.test;

import java.util.ArrayList;
import java.util.Iterator;

/**
 * 关于ArrayList数组在循环中删除所出现的问题
 *
 * @author ysf
 * @date 2020/2/24 11:43
 */
public class ArrayListRemove {

    public static void main(String[] args) {
        ArrayList<String> list=new ArrayList<String>();
        list.add("a");
        list.add("bb");
        list.add("bb");
        list.add("ccc");
        list.add("ccc");
        list.add("ccc");
        remove(list);
        for (String s:list){
            System.out.println("element:"+s);
        }
    }

    /**
     * 通过循环的方式删除ArrayList中的元素
     * @param list
     */
    public static void remove(ArrayList<String> list){
        /**
         * 方法一
         * 普通的for循环删除方法,在删除的过程中,不能删除重复的元素
         */
       /* for (int i=0;i<list.size();i++){
            String s=list.get(i);
            if(s.equals("bb")){
                list.remove(s);
            }
        }*/
        /**
         * 方法二
         *  普通的for循环倒序删除,删过程中元素向左移动,可以删除重复的元素
         */
        /*for(int i=list.size()-1;i>=0;i--){
            if(list.get(i).equals("bb")){
                list.remove(list.get(i));
            }
        }*/

        /**
         * 方法三：增强for循环删除,使用ArrarList的remove()方法删除产生并修改异常ConcurrentModificationException
         */
        for(String str:list){
            if(str.equals("bb")){
                list.remove(str);
            }
        }
        /**
         * 方法四:迭代器,使用ArrayList的remove()方法删除,产生并发修改异常ConcurrentModificationException
         */
        Iterator iterator=list.iterator();
        while(iterator.hasNext()){
            if(iterator.next().equals("bb")){
                list.remove(iterator.next());
            }
        }
        /**
         * 方法五：迭代器,使用迭代器的remove()方法删除,可以删除重复的元素,但不推荐
         */
        Iterator iterator1=list.iterator();
        while (iterator.hasNext()){
            if(iterator.next().equals("bb")){
                    iterator1.remove();
            }
        }














    }

    /**
     * 方法二
     * @param list
     */
    public static void removes(ArrayList<String> list){
        for (String s:list){
            if(s.equals("bb")){
                list.remove(s);
            }
        }
    }



}
